www.gusucode.com > VC 2D游戏编辑器-源码程序 > VC 2D游戏编辑器-源码程序/code/game_Source/GameLib/script/script.cpp
//Download by http://www.NewXing.com #include "script.h" #include "..\\..\\newgame.h" #include "..\\..\\main.h" void CALLBACK ScriptTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime); int iTimerId; bool bNewTime = false; CScript::CScript(int id, char * cName, char *FILENAME) { LoadNewScript(id , cName, FILENAME); } CScript::CScript( ) { Script = NULL; cScriptName[0] = '\0'; iExplainResult = -1; iPosition = 0; IsAgain = false; } CScript::~CScript( ) { PA_SAFE_DELETE(Script); cScriptName[0] = '\0'; } void CScript::Destroy( ) { PA_SAFE_DELETE(Script); cScriptName[0] = '\0'; } void CScript::Run( ) { if( iScriptID == 0xffff && !IsAgain ) { KillTimer(hwnd, 1); bNewTime = false; } while(iPosition < (int)ScriptHeader.nScriptN) { Explain( ); switch(iExplainResult) { case 0xffff: case 0xeeee: Destroy( ); NewGameSelect = 99 ; //退出游戏 NewGameOut = true; return; break; case 0xdddd: if( (iScriptID == 0xffff) && !bNewTime ) { SetTimer(hwnd, 1, 50, NewGameTimer); bNewTime = true; } return; break; } iPosition ++; } if(iPosition == (int)ScriptHeader.nScriptN) { if(iScriptID == 0xffff) SetTimer(hwnd, 1, 50, NewGameTimer); Destroy( ); } } void CScript::Pause( ) { iExplainResult = 0xdddd; } void CScript::Restart( ) { iPosition = 0; iExplainResult = -1; IsAgain = false; Run( ); } bool CScript::LoadNewScript(int id, char * cName, char *FILENAME) { if(Script != NULL) { PA_SAFE_DELETE(Script); } FILE *file=fopen(FILENAME,"rb"); if(!file) { MsgBox("不能打开脚本文件!%s",FILENAME); return false; } fread((char *)&ScriptHeader, sizeof(_ScriptHeader), 1, file); Script = new _Script[ScriptHeader.nScriptN]; fread((char *)Script, ScriptHeader.nScriptN*sizeof(_Script), 1, file); fclose(file); iPosition = 0; iScriptID = id; iExplainResult = -1; IsAgain = false; strcpy(cScriptName, cName); return true; } bool CScript::LoadScript() { if(cScriptName[0] == '\0') return false; char cScript_Path[MAX_PATH]; strcpy(cScript_Path, "Resource\\script\\"); strcat(cScript_Path, cScriptName); if(Script != NULL) { PA_SAFE_DELETE(Script); } FILE *file=fopen(cScript_Path,"rb"); if(!file) { MsgBox("不能打开脚本文件!%s",cScript_Path); return false; } fread((char *)&ScriptHeader, sizeof(_ScriptHeader), 1, file); Script = new _Script[ScriptHeader.nScriptN]; fread((char *)Script, ScriptHeader.nScriptN*sizeof(_Script), 1, file); fclose(file); iExplainResult = -1; IsAgain = false; return true; } void CScript::GetParameter(char *str, int iNumber) { int i, j, k; k = 0; for(i = 0; i < iNumber; i++) { j = 0; while((str[k] != NULL)&&((str[k] != '@')||(str[k+1] != '@'))) { cParameter[i][j] = str[k]; j++; k++; } k += 2; cParameter[i][j] = '\0'; } } void CScript::Explain( ) { int i, j, m, x, y, time, iSize, iWeight; int pmr1, pmr2, iEvent; bool bBool; RECT rect; DWORD dColor; bool IsTrue = false; char * pParameter; char cScript_Path[MAX_PATH]; HDC hdc; CFont cFont; iExplainResult = -1; switch(Script[iPosition].wKeyId) { case 0: i = 0; while(i != (int)ScriptHeader.nScriptN) { if(Script[i].wKeyId == 65535) { if(!strcmp((char *)Script[iPosition].wParameter, (char *)Script[i].wParameter)) { iPosition = i+1; break; } } i++; } if(i == (int)ScriptHeader.nScriptN) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } break; case 1: m = 0; pParameter = (char *)Script[iPosition].wParameter; while((pParameter[0] != '@')||(pParameter[1] != '@')) { IsTrue = false; pmr1 = (* parameter[Script[iPosition].wParameter[m]]); if(Script[iPosition].wParameter[m+2]&0x8000) pmr2 = Script[iPosition].wParameter[m+2]&0x7fff; //是常量 else pmr2 = (* parameter[Script[iPosition].wParameter[m+2]]); //是变量 switch(Script[iPosition].wParameter[m+1]) { case 0: //!= if(pmr1 != pmr2) IsTrue = true; else IsTrue = false; break; case 1: //> if(pmr1 > pmr2) IsTrue = true; else IsTrue = false; break; case 2: //>= if(pmr1 >= pmr2) IsTrue = true; else IsTrue = false; break; case 3: //= if(pmr1 == pmr2) IsTrue = true; else IsTrue = false; break; case 4: //<= if(pmr1 <= pmr2) IsTrue = true; else IsTrue = false; break; case 5: //< if(pmr1 < pmr2) IsTrue = true; else IsTrue = false; break; default: IsTrue = false; } if(!IsTrue) break; m += 3; pParameter = (char *)&Script[iPosition].wParameter[m]; } if(IsTrue) { i = 0; while(i != (int)ScriptHeader.nScriptN) { if(Script[i].wKeyId == 0xffff) { if(!strcmp((char *)&(Script[iPosition].wParameter[m+1]), (char *)Script[i].wParameter)) { iPosition = i+1; break; } } i++; } if(i == (int)ScriptHeader.nScriptN) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } } else { iExplainResult = 0x0001; } break; case 2: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); strcpy(cScript_Path, "Resource\\script\\"); strcat(cScript_Path, cParameter[0]); m = atoi(cParameter[1]); for(i = 0; i < 10; i++) if(Script_Child[i].Script == NULL) { Script_Child[i].LoadNewScript(m, cParameter[0], cScript_Path); Script_Child[i].iId = i; break; } if(i == 10) { MsgBox("脚本子文件过多!"); iExplainResult = 0xffff; } break; case 3: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = 0; while(i != 10) { if(!strcmp(cParameter[0], (char *)Script_Child[i].cScriptName)) { Script_Child[i].Run(); switch(Script_Child[i].iExplainResult) { case 0xffff: iExplainResult = 0xffff; break; case 0xeeee: iExplainResult = 0xeeee; break; case 0xdddd: iExplainResult = 0xdddd; break; } break; } i++; } if(i == 10) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } break; case 4: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); if(!strcmp(cParameter[0], "this")) { Restart( ); } else { i = 0; while(i != 10) { if(!strcmp(cParameter[0], (char *)Script_Child[i].cScriptName)) { Script_Child[i].Restart(); switch(Script_Child[i].iExplainResult) { case 0xffff: iExplainResult = 0xffff; break; case 0xeeee: iExplainResult = 0xeeee; break; case 0x1111: iExplainResult = 0x1111; break; } break; } i++; } if(i == 10) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } } break; case 10: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); iSize = atoi(cParameter[2]); iWeight = atoi(cParameter[3]); dColor = (cParameter[4][0]|(cParameter[4][1]<<8)|(cParameter[4][2]<<16))&0xffffff; rect.left = x-30; if(rect.left < 0) rect.left = 0; rect.top = y-30; if(rect.top < 0) rect.top = 0; rect.right = rect.left + strlen(cParameter[5])*iSize/2+90; if(rect.right > SCREEN_WIDTH) rect.right = SCREEN_WIDTH -1; rect.bottom = rect.top + iSize+60; if(rect.bottom > SCREEN_HEIGHT) rect.bottom = SCREEN_HEIGHT-1; ImageAlpha(rect.left, rect.top, rect, pS[SBuffer], pS[SBuffer], SP[SBuffer], SP[SBuffer], 16, false, 0); DDS[SBuffer]->GetDC(&hdc); cFont.UseFont(hdc,DCF_USERDEFINE, iSize, iWeight); ShowText(hdc, x, y, dColor, cParameter[5]); cFont.RestoreFont(hdc); DDS[SBuffer]->ReleaseDC(hdc); UpdateScreen(); break; case 13: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); int pmr; if(Script[iPosition].wParameter[2]&0x8000) pmr = Script[iPosition].wParameter[2]&0x7fff; //是常量 else pmr = * parameter[Script[iPosition].wParameter[2]]; //是变量 * parameter[Script[iPosition].wParameter[0]] = pmr; break; case 19: strcpy(cScript_Path, "sound\\"); strcat(cScript_Path, (char *)Script[iPosition].wParameter); mainMusic->LoadMusic(cScript_Path); break; case 20: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); time = atoi(cParameter[0]); mainMusic->Play(time); break; case 21: mainMusic->Stop(); break; case 22: mainMusic->Pause(); break; case 23: mainMusic->Resume(); break; case 24: strcpy(cScript_Path, "sound\\"); strcat(cScript_Path, (char *)Script[iPosition].wParameter); mainSound->LoadSound(cScript_Path); break; case 25: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); time = atoi(cParameter[0]); mainSound->Play(time); break; case 26: mainSound->Stop(); break; case 30: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); time = atoi(cParameter[0]); Delay(time); break; case 31: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); rect.left = atoi(cParameter[1]); rect.top = atoi(cParameter[2]); rect.right = atoi(cParameter[3]); rect.bottom = atoi(cParameter[4]); time = atoi(cParameter[5]); FadeIn(i, rect, time); break; case 32: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); rect.left = atoi(cParameter[1]); rect.top = atoi(cParameter[2]); rect.right = atoi(cParameter[3]); rect.bottom = atoi(cParameter[4]); time = atoi(cParameter[5]); FadeOut(i, rect, time); break; case 40: GameStatus = GAME_NORMAL; break; case 41: GameStatus = GAME_PAUSE; break; case 47: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); if(!strcmp(cParameter[0], "this")) { Pause( ); iPosition++; } else { i = 0; while(i != 10) { if(!strcmp(cParameter[0], (char *)Script_Child[i].cScriptName)) { Script_Child[i].Pause(); break; } i++; } if(i == 10) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } } break; case 48: iExplainResult = 0x1111; break; case 49: iExplainResult = 0xeeee; break; case 50: strcpy(cScript_Path, "map\\"); strcat(cScript_Path, (char *)Script[iPosition].wParameter); for(i = 0; i < 9; i++) if(Map_Child[i].pSurfaceData == NULL) { Map_Child[i].LoadMap(i, (char *)Script[iPosition].wParameter, cScript_Path); break; } if(i == 10) { MsgBox("地图文件过多!"); iExplainResult = 0xffff; } break; case 52: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); bBool = (bool)(atoi(cParameter[2])); Map->pSurfaceData[y*Map->pHeader.nWidth+x].nUseTranSition = bBool; break; case 53: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); iEvent = atoi(cParameter[2]); Map->pSurfaceData[y*Map->pHeader.nWidth+x].nEvent = iEvent; break; case 56: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); pmr1 = atoi(cParameter[2]); pmr2 = atoi(cParameter[3]); i = atoi(cParameter[4]); Map->ChangeObjPosition(x, y, pmr1, pmr2, i); break; case 57: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); i = atoi(cParameter[2]); bBool = (bool)(atoi(cParameter[3])); Map->pSurfaceData[y*Map->pHeader.nWidth+x].nID = i; Map->pSurfaceData[y*Map->pHeader.nWidth+x].nUseTranSition = bBool; break; case 58: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); pmr1 = atoi(cParameter[2]); pmr2 = atoi(cParameter[3]); i = atoi(cParameter[4]); Map->ChangeObjID(x, y, pmr1, pmr2, i); break; case 59: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); m = atoi(cParameter[2]); if(dMap_StartX < x) { pmr1 = 1; } else { pmr1 = -1; } if(dMap_StartY < y) { pmr2 = 1; } else { pmr2 = -1; } i = dMap_StartX; j = dMap_StartY; while((abs(i - x) > m)||(abs(j - y) > m)) { dMap_StartX = i; dMap_StartY = j; FreshTheMap(Map, i, j); UpdateScreen(); if(abs(i - x) > m) i += pmr1*m; if(abs(j - y) > m) j += pmr2*m; if(j > 1340) bBool = true; } dMap_StartX = atoi(cParameter[0]); dMap_StartY = atoi(cParameter[1]); FreshTheMap(Map, i, j); break; case 60: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); pmr1 = atoi(cParameter[2]); pmr2 = atoi(cParameter[3]); pParameter = cParameter[4]; i = 0; while(i != 9) { if(!strcmp(pParameter, (char *)Map_Child[i].cMapName)) { FreshTheMap(Map_Child, pmr1, pmr2); break; } i++; } if(i == 9) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } break; case 61: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); dMap_StartX = x; dMap_StartY = y; FreshTheMap(Map, x, y); break; case 62: UpdateScreen(); break; case 70: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); pParameter = cParameter[0]; i = 0; while(i != 9) { if(!strcmp(pParameter, (char *)Map_Child[i].cMapName)) { Map = &Map_Child[i]; break; } i++; } if(i == 9) { MsgBox("脚本出错!"); iExplainResult = 0xffff; } break; case 100: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->level = i; break; case 101: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); role->dx = role->x = x; role->dy = role->y = y; FreshTheMap(Map, dMap_StartX, dMap_StartY); break; case 102: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->v = i; break; case 103: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->speed = i; break; case 104: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->health = i; break; case 105: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->MaxHealth = i; break; case 106: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->vigor = i; break; case 107: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->MaxVigor = i; break; case 108: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->energy = i; break; case 109: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->MaxEnergy = i; break; case 110: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->defend = i; break; case 111: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->attack = i; break; case 112: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->agility = i; break; case 113: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->FollowID = i; break; case 114: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->Bmoney = i; break; case 115: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->Smoney = i; break; case 116: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->experiment = i; break; case 117: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->MaxExperiment = i; break; case 118: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); i = atoi(cParameter[1]); m = atoi(cParameter[2]); role->skill[x].id = i; role->skill[x].level = m; break; case 119: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); i = atoi(cParameter[1]); m = atoi(cParameter[2]); role->medica_goods[x].id = i; role->medica_goods[x].iNumber = m; break; case 120: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); i = atoi(cParameter[1]); role->equiped[x] = i; break; case 121: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); role->face = i; role->show(); FreshTheMap(Map, dMap_StartX, dMap_StartY); break; case 130: if(!IsAgain) { GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); m = atoi(cParameter[2]); sprintf(cParameter[3], "%d", role->speed); role->speed = m; role->moveto(x, y); IsAgain = true; Pause( ); if(iScriptID != 0xffff) { iTimerId = iId; SetTimer(hwnd, 9, 50, ScriptTimer); } break; } else if((role->WalkNumber != -1)||(role->FootStatus != -1)) { Pause( ); break; } if(iScriptID != 0xffff) KillTimer(hwnd, 9); role->speed = atoi(cParameter[3]); IsAgain = false; iExplainResult = -1; break; case 141: if(!IsAgain) { GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); y = atoi(cParameter[1]); i = atoi(cParameter[2]); role->Waittime = magicRLE_user->bfWidthBitN; role->MagicUsing.id = i; role->MagicUsing.x = x; role->MagicUsing.y = y; role->MagicUsing.n = 0; role->MagicUsing.owner = TMain; role->MagicUsing.IsMagicShowing = false; role->MagicUsing.life = magicRLE[i]->bfWidthBitN; role->MagicUsing.Back = NULL; IsAgain = true; Pause( ); if(iScriptID != 0xffff) { iTimerId = iId; SetTimer(hwnd, 9, 50, ScriptTimer); } role->faceto(x, y); break; } else if(role->Waittime != 0) { Pause( ); break; } if(iScriptID != 0xffff) KillTimer(hwnd, 9); IsAgain = false; iExplainResult = -1; break; case 142: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = atoi(cParameter[0]); i = atoi(cParameter[1]); while(i > 0) { Goods->UseGoods(role, 1, x); i --; } break; case 143: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); x = role->x; y = role->y; DDS[SBuffer]->GetDC(&hdc); cFont.UseFont(hdc,DCF_NOMAL); ShowText(hdc, x, y, RGB(255,255,255), cParameter[0]); cFont.RestoreFont(hdc); DDS[SBuffer]->ReleaseDC(hdc); UpdateScreen(); break; case 150: strcpy(cScript_Path, "map\\"); strcat(cScript_Path, (char *)Script[iPosition].wParameter); if(Zoetic != NULL) P_SAFE_DELETE(Zoetic); Zoetic = new CZoetic(0, (char *)Script[iPosition].wParameter, cScript_Path); break; case 151: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->MainStatus[i] = m; FreshTheMap(Map, dMap_StartX, dMap_StartY); break; case 152: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); strcpy((char *)Zoetic->ZoeticLink[i].dName, cParameter[1]); break; case 153: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].dType = m; break; case 154: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].dPicN = m; FreshTheMap(Map, dMap_StartX, dMap_StartY); break; case 155: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); x = atoi(cParameter[1]); y = atoi(cParameter[2]); Zoetic->ZoeticLink[i].x = x; Zoetic->ZoeticLink[i].y = y; break; case 156: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); x = atoi(cParameter[1]); y = atoi(cParameter[2]); Zoetic->ZoeticLink[i].dCurrent_x = Zoetic->dx[i] = x; Zoetic->ZoeticLink[i].dCurrent_y = Zoetic->dy[i] = y; FreshTheMap(Map, dMap_StartX, dMap_StartY); break; case 157: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].dArea = m; break; case 158: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].dEvent = m; break; case 159: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].dCharacter = m; break; case 160: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].v = m; break; case 161: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].speed = m; break; case 162: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].health= m; break; case 163: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].MaxHealth = m; break; case 164: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].vigor = m; break; case 165: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].MaxVigor = m; break; case 166: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].energy = m; break; case 167: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].MaxEnergy = m; break; case 168: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].defend = m; break; case 169: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].attack = m; break; case 170: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].agility = m; break; case 171: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].FollowID = m; break; case 172: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].Bmoney = m; break; case 173: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].experiment = m; break; case 174: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); Zoetic->ZoeticLink[i].MaxExperiment = m; break; case 175: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); x = atoi(cParameter[2]); y = atoi(cParameter[3]); Zoetic->ZoeticLink[i].skill[m].id = x; Zoetic->ZoeticLink[i].skill[m].level = y; break; case 176: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); x = atoi(cParameter[2]); y = atoi(cParameter[3]); Zoetic->ZoeticLink[i].medica_goods[m].id = x; Zoetic->ZoeticLink[i].medica_goods[m].iNumber = y; break; case 177: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); x = atoi(cParameter[2]); Zoetic->ZoeticLink[i].equiped[m] = x; break; case 178: if(!IsAgain) { GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); x = atoi(cParameter[1]); y = atoi(cParameter[2]); m = atoi(cParameter[3]); sprintf(cParameter[4], "%d", Zoetic->ZoeticLink[i].speed); Zoetic->MovetoI(i, x, y); IsAgain = true; Pause(); if(iScriptID != 0xffff) { iTimerId = iId; SetTimer(hwnd, 9, 50, ScriptTimer); } break; } else if((Zoetic->WalkNumber[atoi(cParameter[0])] != -1)||(Zoetic->FootStatus[atoi(cParameter[0])] != -1)) { Pause( ); break; } if(iScriptID != 0xffff) KillTimer(hwnd, 9); Zoetic->ZoeticLink[atoi(cParameter[0])].speed = atoi(cParameter[4]); IsAgain = false; iExplainResult = -1; break; case 179: if(!IsAgain) { GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); x = atoi(cParameter[2]); y = atoi(cParameter[3]); for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++) { if(Zoetic->ZoeticLink[j].dID == i) break; } if(j == (int)Zoetic->ZoeticHeader.nMagicN) break; Fire(j, x, y, m); Pause(); IsAgain = true; if(iScriptID != 0xffff) { iTimerId = iId; SetTimer(hwnd, 9, 50, ScriptTimer); } break; } else if(Zoetic->Waittime[atoi(cParameter[0])] != -1) { Pause(); break; } if(iScriptID != 0xffff) KillTimer(hwnd, 9); IsAgain = false; iExplainResult = -1; break; case 180: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); x = atoi(cParameter[2]); while(x > 0) { Goods->UseGoods(i, 1, m); x --; } break; case 181: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++) { if(Zoetic->ZoeticLink[j].dID == i) break; } if(j == (int)Zoetic->ZoeticHeader.nMagicN) break; x = Zoetic->ZoeticLink[j].dCurrent_x; y = Zoetic->ZoeticLink[j].dCurrent_y; DDS[SBuffer]->GetDC(&hdc); cFont.UseFont(hdc,DCF_NOMAL); ShowText(hdc, x, y, RGB(255,255,0), cParameter[1]); cFont.RestoreFont(hdc); DDS[SBuffer]->ReleaseDC(hdc); UpdateScreen(); break; case 182: GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); x = atoi(cParameter[1]); for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++) { if(Zoetic->ZoeticLink[j].dID == i) break; } if(j == (int)Zoetic->ZoeticHeader.nMagicN) break; Zoetic->face[j] = x; FreshTheMap(Map, dMap_StartX, dMap_StartY); break; case 183: if(!IsAgain) { GetParameter((char *)Script[iPosition].wParameter, Script[iPosition].wParameterN); i = atoi(cParameter[0]); m = atoi(cParameter[1]); x = atoi(cParameter[2]); for(j = 0; j < (int)Zoetic->ZoeticHeader.nMagicN; j++) { if(Zoetic->ZoeticLink[j].dID == i) break; } if(j == (int)Zoetic->ZoeticHeader.nMagicN) break; if(x == 9999) Fire(j, role->x, role->y, m); else { for(y = 0; y < (int)Zoetic->ZoeticHeader.nMagicN; y++) { if(Zoetic->ZoeticLink[y].dID == x) break; } if(y == (int)Zoetic->ZoeticHeader.nMagicN) break; Fire(j, Zoetic->ZoeticLink[y].dCurrent_x, Zoetic->ZoeticLink[y].dCurrent_y, m); } Pause(); IsAgain = true; if(iScriptID != 0xffff) { iTimerId = iId; SetTimer(hwnd, 9, 50, ScriptTimer); } break; } else if(Zoetic->Waittime[atoi(cParameter[0])] != -1) { Pause(); break; } if(iScriptID != 0xffff) KillTimer(hwnd, 9); IsAgain = false; iExplainResult = -1; break; case 0xffff: break; } } void CScript::FreshTheMap(CMap *pMap, long dStartX, long dStartY) { RECT rect; rect.left = dStartX; rect.top = dStartY; rect.right = rect.left + SW[SMap]; rect.bottom = rect.top + SH[SMap]; pMap->ShowMap_Surface(rect, 0, 0); rect.left = dStartX%32; rect.top = dStartY%32; rect.right = rect.left+SCREEN_WIDTH; rect.bottom = rect.top+SCREEN_HEIGHT; FastBlt(0, 0, rect, pS[SBuffer], pS[SMap], SP[SBuffer], SP[SMap], false, 0); rect.left = dStartX; rect.top = dStartY; rect.bottom = rect.left + SCREEN_WIDTH; rect.bottom = rect.top+SCREEN_HEIGHT; pMap->ShowMap_Obj(rect, 0, 0); } void CALLBACK ScriptTimer(HWND hwnd,UINT uMsg,UINT idEvent,DWORD dwTime) { Script_Child[iTimerId].Run( ); } void OpenScriptInit( ) { int i; FILE *file=fopen("resource\\script\\script.key","rb"); if(!file) { MsgBox("不能打开脚本关键字文件!"); return; } fread((char *)&ScriptKeyHeader, sizeof(_ScriptKeyHeader), 1, file); fread((char *)cScriptText, Max_Script_Key*30*sizeof(char), 1, file); fread((char *)cScriptParameter, Max_Script_Key*10*sizeof(char), 1, file); fclose(file); if(parameter == NULL) { file = fopen("resource\\script\\parameter.pmr", "rb"); if(!file) { MsgBox("不能打开变量文件!"); return; } fread((char *)&ParameterHeader, sizeof(_ScriptParameterHeader), 1, file); fclose(file); parameter = (int **) new int[ParameterHeader.nParameterN]; parameter[0] = &role->level; parameter[1] = &role->health; parameter[2] = &role->MaxHealth; parameter[3] = &role->energy; parameter[4] = &role->MaxEnergy; parameter[5] = &role->vigor; parameter[6] = &role->MaxVigor; parameter[7] = &role->speed; parameter[8] = &role->v; parameter[9] = &role->experiment; parameter[10] = &role->MaxExperiment; parameter[11] = &role->reputation; parameter[12] = &role->character; parameter[13] = &role->x; parameter[14] = &role->y; parameter[15] = &role->face; parameter[16] = &role->defend; parameter[17] = &role->attack; parameter[18] = &role->Waittime; for(i = 19; i < (int)ParameterHeader.nParameterN; i++) { parameter[i] = new int; *parameter[i] = 0; } } }